package io_0929;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

/**
 * 小程序练习:
 * 扫描指定目录，并找到名称中包含指定字符的所有普通文件（不包含目录），
 * 并且后续询问用户是否要删除该文件
 */
public class MiniProgram1 {
    public static void main(String[] args) throws IOException {
        // 1. 让用户输入必要信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径: ");
        // 判断输入的结果是不是正确的路径
        File rootDir = new File(scanner.next());
        while(!rootDir.isDirectory()) {
            System.out.println("您输入的路径不正确!");
            System.out.println("请再次输入:");
            rootDir = new File(scanner.next());
        }

        System.out.println("请输入要搜索的关键词: ");
        String toDelete = scanner.next();

        // 2. 遍历目录. 需要借助listFiles方法. 该方法 能把当前目录里的文件和子目录列举出来,
        // 但是这个方法只能列出一层 没法直接列出子目录中的子目录
        // 解决方案就是遍历listFiles的结果,针对每一个元素,进行判定,看它时普通文件还是一个目录,
        // 如果是普通文件, 直接判定文件名是否包含要查的关键词.
        // 如果是目录, 递归的调用 listFiles方法.
        scanDir(rootDir,toDelete);
    }

    // 借助该函数进行递归遍历
    private static void scanDir(File rootDir, String toDelete) throws IOException {
        System.out.println("当前访问: " + rootDir.getCanonicalPath());
        File[] files = rootDir.listFiles();
        // files为空 说明rootDir是一个空目录.
        if(files == null) { return; }

        // 目录非空 遍历元素
        for (File f : files) {
            if(f.isDirectory()) {
                // 是目录 递归调用listFiles
                scanDir(f,toDelete);
            } else {
                // 是普通文件 判定该文件是否满足要求.
                checkDelete(f,toDelete);
            }
        }
    }

    // 判断文件是否满足要求 满足的话是否需要删除
    private static void checkDelete(File f, String toDelete) throws IOException {
        if(f.getName().contains(toDelete)) {
            // 满足要求
            System.out.println(toDelete + "被包含在" + f.getCanonicalPath() + "中");
            System.out.println("是否删除 " + f.getName() + " 文件? (Y / N )");

            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if(choice.equals("Y") || choice.equals("y")) {
                boolean flg = f.delete();
                if(flg) System.out.println("删除成功!");
            }

        }
    }
}
